﻿using Soa32.Zanfranceschi.Mensageria.Mensagens;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Messaging;
using System.Text;
using System.Threading;

namespace Soa32.Zanfranceschi.Mensageria.Servidor
{
	class ServidorMensageria
	{
		static void Main(string[] args)
		{
			Console.Title = "Servidor Mensageria";
			Console.WindowHeight = 10;
			Console.WindowWidth = 60;

			Thread requestReplyThread = new Thread(RequestReply);
			Thread commandThread = new Thread(Command);
			Thread pubThread = new Thread(Pub);

			requestReplyThread.Start();
			commandThread.Start();
			pubThread.Start();

			Console.Read();
		}

		static void RequestReply()
		{
			MessageQueue filaRequisicao = new MessageQueue(@".\private$\requisicao");
			MessagePropertyFilter filtro = new MessagePropertyFilter();
			filtro.SetDefaults();
			filaRequisicao.MessageReadPropertyFilter = filtro;
			filaRequisicao.Formatter = new BinaryMessageFormatter();
			Console.WriteLine("Aguardando requisições...");
			while (true)
			{
				Message msgRequisicao = filaRequisicao.Receive();
				Requisicao objRequisicao = (Requisicao)msgRequisicao.Body;
				Console.WriteLine("{0} - Requisição recebida: {1}", DateTime.Now, objRequisicao.Texto);
				Resposta objResposta = new Resposta(objRequisicao, "texto para requisição");
				Message msgResposta = new Message(objResposta, new BinaryMessageFormatter());
				msgResposta.CorrelationId = msgRequisicao.Id;
				MessageQueue filaResposta = msgRequisicao.ResponseQueue;
				filaResposta.Send(msgResposta);
				Console.WriteLine("{0} - Resposta enviada: {1}", DateTime.Now, objResposta.Entidade.ToString());
			}
		}

		static void Command()
		{
			MessageQueue filaRequisicao = new MessageQueue(@".\private$\comando");
			MessagePropertyFilter filtro = new MessagePropertyFilter();
			filtro.SetDefaults();
			filaRequisicao.MessageReadPropertyFilter = filtro;
			filaRequisicao.Formatter = new BinaryMessageFormatter();
			Console.WriteLine("Aguardando comandos...");
			while (true)
			{
				Message msgComando = filaRequisicao.Receive();
				Comando comando = (Comando)msgComando.Body;
				Console.WriteLine("{0} - Comando recebido: {1} -> {2}", DateTime.Now, comando.Instrucao, comando.Entidade.ToString());
			}
		}

		static void Pub()
		{
			MessageQueue publishQueue = new MessageQueue("FormatName:MULTICAST=236.1.1.1:8001");
			Random random = null;
			while (true)
			{
				Notificacao notificacao = new Notificacao("Algo ocorreu.");
				Message publishMessage = new Message(notificacao, new BinaryMessageFormatter());
				publishQueue.Send(publishMessage);
				random = new Random();
				Thread.Sleep(random.Next(1 * 1000, 20 * 1000)); // de 1 a 20 segundos
			}
		}
	}
}
